package com.hgw.easyexceldemo;

import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.util.ListUtils;
import com.hgw.easyexceldemo.domain.*;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;

import java.net.MalformedURLException;
import java.net.URL;
import java.util.*;

/**
 * Description:
 * Data time:2022/8/30 14:03
 * Author:TQ-3038-HuangGongWei
 */
@SpringBootTest
public class WriteDemo {

    private final String PATH = "/Users/gwh/Documents/data/java/easy-excel-demo/easyexceldemo/src/main/resources/warehouse/";

    /**
     * 通用数据生成
     *
     * @return
     */
    private List<DemoData> data() {
        List<DemoData> list = ListUtils.newArrayList();
        for (int i = 0; i < 10; i++) {
            DemoData data = new DemoData();
            data.setString("字符串" + i);
            data.setDate(new Date());
            data.setDoubleData(0.56);
            list.add(data);
        }
        return list;
    }

    /**
     * 最简单的写
     * <p>
     * 1. 创建excel对应的实体对象 参照{@link DemoData}
     * <p>
     * 2. 直接写即可
     */
    @Test
    public void simpleWrite() {
        // 注意 simpleWrite在数据量不大的情况下可以使用（5000以内，具体也要看实际情况），数据量大参照 重复多次写入

        String fileName = PATH + "简单写模板.xlsx";
        // 这里 需要指定写用哪个class去写，然后写到第一个sheet，名字为模板 然后文件流会自动关闭
        // 如果这里想使用03 则 传入excelType参数即可
        // write(fileName, 格式类)
        // sheet(表名)
        // doWrite(数据)
        EasyExcel.write(fileName, DemoData.class)
                .sheet("模板")
                .doWrite(() -> {
                    // 分页查询数据
                    return data();
                });
    }

    /**
     * 根据参数只导出指定列
     * <p>
     * 1. 创建excel对应的实体对象 参照{@link DemoData}
     * <p>
     * 2. 根据自己或者排除自己需要的列
     * <p>
     * 3. 直接写即可
     *
     * @since 2.1.1
     */
    @Test
    public void excludeOrIncludeWrite() {
        // 根据用户传入字段 假设我们要忽略 date
        String fileName = PATH + "根据参数忽略指定列模板.xlsx";
        Set<String> excludeColumnFiledNames = new HashSet<String>();
        excludeColumnFiledNames.add("date");
        EasyExcel.write(fileName, DemoData.class).excludeColumnFiledNames(excludeColumnFiledNames).sheet("模板")
                .doWrite(data());

        // 根据用户传入字段 假设我们只要导出 date
        fileName = PATH + "根据参数只导出指定列模板.xlsx";
        Set<String> includeColumnFiledNames = new HashSet<String>();
        includeColumnFiledNames.add("date");
        EasyExcel.write(fileName, DemoData.class).includeColumnFiledNames(includeColumnFiledNames).sheet("模板")
                .doWrite(data());
    }

    @Test
    public void indexWrite() {
        String fileName = PATH + "指定写入的列模板.xlsx";
        // 这里 需要指定写用哪个class去写，然后写到第一个sheet，名字为模板 然后文件流会自动关闭
        EasyExcel.write(fileName, IndexData.class).sheet("模板").doWrite(data());
    }

    @Test
    public void userWrite() {
        String fileName = PATH + "用户表模板.xlsx";
        // 这里 需要指定写用哪个class去写，然后写到第一个sheet，名字为模板 然后文件流会自动关闭
        EasyExcel.write(fileName, User.class).sheet("模板").doWrite(data());
    }


    /**
     * 根据 URL 图片导出_单张图片
     */
    @Test
    public void imageWrite() {
        String fileName = PATH + "导出图片Demo.xlsx";
        EasyExcel.write(fileName, ImageDemoData.class)
                .sheet("模板")
                .doWrite(() -> {
                    List<ImageDemoData> imageDemoDataList = ListUtils.newArrayList();
                    ImageDemoData imageDemoData = new ImageDemoData();
                    URL url = null;
                    try {
                        url = new URL("https://img.linhuiba.com/FvXO_WtI7CI2z6-kx2BbD93fNdWS-linhuiba_watermark");
                    } catch (MalformedURLException e) {
                        e.printStackTrace();
                    }
                    imageDemoData.setUrl(url);
                    imageDemoDataList.add(imageDemoData);
                    return imageDemoDataList;
                });
    }

    /**
     * 根据 URL 图片导出 _ 多张图片在同一个单元格
     */
    @Test
    public void imageListWrite() {
        String fileName = PATH + "导出多个图片在同一个单元格Demo.xlsx";
        EasyExcel.write(fileName, ImageDemoData.class)
                .sheet("模板")
                .doWrite(() -> {
                    List<ImageDemoListData> imageDemoListDatas = ListUtils.newArrayList();
                    ImageDemoListData imageDemoListData = new ImageDemoListData();
                    List<URL> urlList = ListUtils.newArrayList();
                    try {
                        URL url1  = new URL("https://img.linhuiba.com/FvXO_WtI7CI2z6-kx2BbD93fNdWS-linhuiba_watermark");
                        URL url2 = new URL("https://img.linhuiba.com/FtwtgaPkyqlZeumvgdG6M5djaaLM-linhuiba_watermark");
                        urlList.add(url1);
                        urlList.add(url2);
                    } catch (MalformedURLException e) {
                        e.printStackTrace();
                    }
                    imageDemoListData.setUrlList(urlList);
                    imageDemoListDatas.add(imageDemoListData);
                    return imageDemoListDatas;
                });
    }

}
